package server;
	//线程安全
		//线程安全的问题一般都是由成员变量或静态变量引起的
		//若每个线程中对成员变量或静态变量，只有读操作(取值),而没有写
		//一般来说这个变量是线程安全的

import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//反之，若有多个线程同时执行写的操作，则需要考虑线程同步问题，否则就会出现线程安全的问题
	//线程同步
		//当使用多个线程访问同一个资源时，且多个线程中资源有写的操作
		//就容易出现线程安全的问题
		//要解决这个问题,并访问一个资源的安全性问题
		//Java中提供同步机制，可以用来解决问题
		//操作同一个资源，先让一个线程全部执行完后再执行另一个
//一般在应用中，为了减小锁粒度，降低控制的范围大小，降低效率不那么严重
//推荐使用同步代码块 ,节省资源，提高效率

public class Security {
	synchronized void test() {
		
	}
	public static void main(String[] args) {
		ArrayList<String> list;//线程不安全
		Security te1 = new Security();
		Thread td1 = new Thread("bb");
		td1.start();
		
		
	}
}
//=========================================================================
class TestE implements Runnable{
	
	public static void main(String[] args) {
		TestE te1 = new TestE();
		TestE te2 = new TestE();
		Thread td1 = new Thread(te1,"ST1");
		Thread td2 = new Thread(te2,"ST2");
		td1.start();
		td2.start();
	}
	
	public void run() {
		test1();
	}
	private int count = 0;
	
	private  void test1() {
		Object obj = new Object();
		synchronized(this) {// 同步代码块
			for (int i = 0;i < 1000;i++) {
				System.out.println(Thread.currentThread().getName() + ":" + (count) );
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	// 应用：减小锁颗粒度（控制范围的大小）推荐使用同步代码块，节省资源，提高效率
	
	private synchronized void test0() {// 同步方法
		for (int i = 0;i < 1000;i++) {
			System.out.println(Thread.currentThread().getName() + ":" + (count) );
		}
	}
	
	// 线程安全
	// 线程安全的问题一般都是有成员变量或静态变量引起的
	// 若每个线程中对成员变量（静态变量）只有读操作（取值）,而没有写操作（赋值）
	// 一般来说，这个变量是线程安全的
	// 若多个线程同时执行写的操作，一般都需要考虑线程同步
	// 否则就可能影响线程安全
	
	// 线程同步
	// 当使用多个线程访问同一个资源是，且多个线程中资源有写的操作
	// 就容易出现线程安全问题
	// 要解决上述多线程并发访问一个资源的安全性的问题
	// java中提供同步机制（synchronized），可以来解决
	
	//多个线程中，用同个对象(类)去调用执行某行代码
	//实现不同的进程中，按照先后写顺序，各自鸽子整体执行万改代码块
	//同步代码块，可以用于方法中的某个区域，表示只对这个区域的资源进行互斥访问
	//保证A线程执行该方法时，其他线程只能在方法外等待
	
	public void test4() {
		Lock lock = new ReentrantLock();//重入锁,比sychronized更加强大
		lock.lock();
		System.out.println("-------------");
		lock.unlock();
	}

}






























